/****************************************************************************
 *
 * Copyright 2020 Samsung Electronics All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific
 * language governing permissions and limitations under the License.
 *
 ****************************************************************************/
/****************************************************************************
 * lib/libc/stdio/lib_dtoa_data.c
 *
 *   Copyright © 2018, Keith Packard
 *   All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************/

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <sys/types.h>
#include "lib_dtoa_engine.h"

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

#ifndef DBL_MAX_10_EXP
#error DBL_MAX_10_EXP
#endif

#ifndef DBL_MIN_10_EXP
#error DBL_MIN_10_EXP
#endif

#ifndef DBL_DIG
#error DBL_DIG
#endif

/* Make sure the computed sizes of the arrays match the actual sizes
 * by declaring an array which is legal if the sizes match and illegal
 * if they do not
 */

#define count_of(n)			(sizeof(n) / sizeof(n[0]))
#define match(array, size)		(count_of(array) == size)
#define check_match(array, size)	(match(array, size) ? 1 : -1)

/****************************************************************************
 * Public Data
 ****************************************************************************/

const double_t g_dtoa_scale_up[] = {
#if DBL_MAX_10_EXP >= 1
	1e1,
#endif
#if DBL_MAX_10_EXP >= 2
	1e2,
#endif
#if DBL_MAX_10_EXP >= 4
	1e4,
#endif
#if DBL_MAX_10_EXP >= 8
	1e8,
#endif
#if DBL_MAX_10_EXP >= 16
	1e16,
#endif
#if DBL_MAX_10_EXP >= 32
	1e32,
#endif
#if DBL_MAX_10_EXP >= 64
	1e64,
#endif
#if DBL_MAX_10_EXP >= 128
	1e128,
#endif
#if DBL_MAX_10_EXP >= 256
	1e256,
#endif
#if DBL_MAX_10_EXP >= 512
	1e512,
#endif
#if DBL_MAX_10_EXP >= 1024
	1e1024,
#endif
#if DBL_MAX_10_EXP >= 2048
	1e2048,
#endif
#if DBL_MAX_10_EXP >= 4096
	1e4096,
#endif
#if DBL_MAX_10_EXP >= 8192
	1e8192,
#endif
#if DBL_MAX_10_EXP >= 16384
	1e16384,
#endif
#if DBL_MAX_10_EXP >= 32768
	1e32768,
#endif
#if DBL_MAX_10_EXP >= 65536
	1e65536,
#endif
};

const double_t g_dtoa_scale_down[] = {
#if DBL_MIN_10_EXP <= -1
	1e-1,
#endif
#if DBL_MIN_10_EXP <= -2
	1e-2,
#endif
#if DBL_MIN_10_EXP <= -4
	1e-4,
#endif
#if DBL_MIN_10_EXP <= -8
	1e-8,
#endif
#if DBL_MIN_10_EXP <= -16
	1e-16,
#endif
#if DBL_MIN_10_EXP <= -32
	1e-32,
#endif
#if DBL_MIN_10_EXP <= -64
	1e-64,
#endif
#if DBL_MIN_10_EXP <= -128
	1e-128,
#endif
#if DBL_MIN_10_EXP <= -256
	1e-256,
#endif
#if DBL_MIN_10_EXP <= -512
	1e-512,
#endif
#if DBL_MIN_10_EXP <= -1024
	1e-1024,
#endif
#if DBL_MIN_10_EXP <= -2048
	1e-2048,
#endif
#if DBL_MIN_10_EXP <= -4096
	1e-4096,
#endif
#if DBL_MIN_10_EXP <= -8192
	1e-8192,
#endif
#if DBL_MIN_10_EXP <= -16384
	1e-16384,
#endif
#if DBL_MIN_10_EXP <= -32768
	1e-32768,
#endif
#if DBL_MIN_10_EXP <= -65536
	1e-65536,
#endif
};

const double_t g_dtoa_round[] = {
#if DBL_DIG >= 30
	5e30,
#endif
#if DBL_DIG >= 29
	5e29,
#endif
#if DBL_DIG >= 28
	5e28,
#endif
#if DBL_DIG >= 27
	5e27,
#endif
#if DBL_DIG >= 26
	5e26,
#endif
#if DBL_DIG >= 25
	5e25,
#endif
#if DBL_DIG >= 24
	5e24,
#endif
#if DBL_DIG >= 23
	5e23,
#endif
#if DBL_DIG >= 22
	5e22,
#endif
#if DBL_DIG >= 21
	5e21,
#endif
#if DBL_DIG >= 20
	5e20,
#endif
#if DBL_DIG >= 19
	5e19,
#endif
#if DBL_DIG >= 18
	5e18,
#endif
#if DBL_DIG >= 17
	5e17,
#endif
#if DBL_DIG >= 16
	5e16,
#endif
#if DBL_DIG >= 15
	5e15,
#endif
#if DBL_DIG >= 14
	5e14,
#endif
#if DBL_DIG >= 13
	5e13,
#endif
#if DBL_DIG >= 12
	5e12,
#endif
#if DBL_DIG >= 11
	5e11,
#endif
#if DBL_DIG >= 10
	5e10,
#endif
#if DBL_DIG >= 9
	5e9,
#endif
#if DBL_DIG >= 8
	5e8,
#endif
#if DBL_DIG >= 7
	5e7,
#endif
#if DBL_DIG >= 6
	5e6,
#endif
#if DBL_DIG >= 5
	5e5,
#endif
#if DBL_DIG >= 4
	5e4,
#endif
#if DBL_DIG >= 3
	5e3,
#endif
#if DBL_DIG >= 2
	5e2,
#endif
#if DBL_DIG >= 1
	5e1,
#endif
#if DBL_DIG >= 0
	5e0,
#endif
};
